热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

外层|条件下_MySQL还能这样玩第五篇之视图应该这样玩

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL还能这样玩---第五篇之视图应该这样玩相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL还能这样玩---第五篇之视图应该这样玩相关的知识,希望对你有一定的参考价值。



mysql还能这样玩---第五篇之视图应该这样玩


  • 什么是视图
  • 临时表原理
  • 视图原理
  • 视图的CRUD
    • 创建视图
    • 使用视图
    • 修改视图
      • 更新视图注意事项

    • 删除视图
    • 查看视图

  • 视图对性能的影响




什么是视图

视图相对于普通表而言,有下面这些优势:


  • 简单 : 使用视图的用户完全不需要关系后面对于的表的结构,关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集
  • 安全 : 使用视图的用户只能访问他们可以查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图可以简单实现
  • 数据独立: 一旦视图的结果确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。



临时表原理

什么是临时表:MySQL用于存储一些中间结果集的表,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。为什么会产生临时表:一般是由于复杂的SQL导致临时表被大量创建

临时表分为两种,一种是内存临时表,一种是磁盘临时表。内存临时表采用的是memory存储引擎,磁盘临时表采用的是myisam存储引擎(磁盘临时表也可以使用innodb存储引擎,通过internal_tmp_disk_storage_engine参数来控制使用哪种存储引擎,从mysql5.7.6之后默认为innodb存储引擎,之前版本默认为myisam存储引擎)。分别通过Created_tmp_disk_tables 和 Created_tmp_tables 两个参数来查看产生了多少磁盘临时表和所有产生的临时表(内存和磁盘)。

内存临时表空间的大小由两个参数控制:tmp_table_size 和 max_heap_table_size 。一般来说是通过两个参数中较小的数来控制内存临时表空间的最大值,而对于开始在内存中创建的临时表,后来由于数据太大转移到磁盘上的临时表,只由max_heap_table_size参数控制。针对直接在磁盘上产生的临时表,没有大小控制。

下列操作会使用到临时表:


  • union查询
  • 对于视图的操作,比如使用一些TEMPTABLE算法、union或aggregation
  • 子查询
  • join 包括not in、exist等
  • 查询产生的派生表
  • 复杂的group by 和 order by
  • Insert select 同一个表,mysql会产生一个临时表缓存select的行
  • 多个表更新
  • GROUP_CONCAT() 或者 COUNT(DISTINCT) 语句

Mysql还会阻止内存表空间的使用,直接使用磁盘临时表:


  • 表中含有BLOB或者TEXT列
  • 使用union或者union all时,select子句有大于512字节的列
  • Show columns或者 desc 表的时候,有LOB或者TEXT
  • GROUP BY 或者 DISTINCT 子句中包含长度大于512字节的列



视图原理





总结:在定义视图的时候,尽可能不要让其走临时表算法,而选择合并算法




视图的CRUD

创建视图

create view 视图名
as
查询语句;

或者

create or replace 视图名
as
查询语句;



使用视图

select v.wID from v;



修改视图

create or replace 视图名
as
查询语句;

或者

alter view 视图名
as
查询语句;



更新视图注意事项

视图的可更新性和查询的定义有关系,以下类型的视图是不可更新的


  • 包含以下关键字的SQL语句: 聚合函数(SUM,MIN,MAX,COUNT等),DISTINCT。GROUP BY , HAVING,UNION或者UNION ALL
  • 常量视图
  • SELECT中包含子查询
  • JOIN
  • FROM一个不能更新的视图
  • WEHERE子句的子查询引用了FROM子句中的表

为什么上面的视图都是不可更新的呢? 看底层实现

重点在于使用临时表算法实现的视图是不可以被更新的,在原表和视图无法建立一一映射的条件下,就会使用临时表算法



举例: 以下视图都是不可更新的

包含聚合函数:
create or replace view pay_sum as
select staff_id,sum(amount) from payment group by staff_id;

常量视图:
create or replace view pi as
select 3.14 as pi

select中包含子查询:
create view city_view as
select (select city from city where city_id=1);

WITH [CASCADED | LOCAL ] CHECK OPTION决定了是否可以更新记录使其不再满足视图的条件,这个选项与ORACLE数据库中的选项是类似的:


  • LOCAL只要满足本视图的条件就可以更新
  • CASCADED则必须满足所有针对该视图的所有视图的条件才可以更新

没有明确LOCAL 和 CASCADED 的前提下,默认为CASCADED

举例: 对payment创建两层视图,并进行更新操作

create view payment_view as
select payment_id,amount from payment
where amount < 10
with check option

create view payment_view1 as
select payment_id,amount from payment_view
where amount > 5
with local check option

create view payment_view2 as
select payment_id,amount from payment
where amount > 5
with cascaded check option

尝试更新:

成功:
update payment_view1 set amount&#61;10
where payment_id&#61;3;

失败:
update payment_view2 set amount&#61;10
where payment_id&#61;3;

payment_view1是WITH LOCAL CHECK OPTION的&#xff0c;所以只要满足本视图的条件就可以更新&#xff0c;但是payment_view2是WITH CASCADED CHECK OPTION的&#xff0c;必须满足针对该视图的所有视图才可以更新&#xff0c;因为更新后记录不再满足payment_view 的条件&#xff0c;所以更新操作提示错误退出。




删除视图

前提拥有删除该视图的DROP权限

drop view v1,v2,v3...



查看视图

show tables命令从mysql 5.1开始&#xff0c;会显示表和视图&#xff0c;不存在单独的show views命令

显示视图信息
show table status from 数据库名 like 表名/视图名

查看视图定义信息
show create view

通过information_schema.views也可以查看视图的相关信息




视图对性能的影响


注意:是在使用临时表算法构建的视图中&#xff0c;无法使用索引&#xff0c;无法使用外层where条件在存储引擎层过滤掉不需要的行数




推荐阅读
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 【go密码学】对称加密算法
    对称加密对称加密算法是相对于非对称加密算法而言,两者的区别在于,对称加密和加密和解密时使用相同的秘钥,而非对称加密在加密和解密时使用不同的秘钥(公钥和私钥)。常见的对称加密算法:D ... [详细]
  • mysql join 算法_【MySQL】之join算法详解
    在阿里巴巴的java开发手册有这么一条强制规定:超过三个表禁止join,须要join的字段,数据类型保持绝对一致,多表关联查 ... [详细]
  • 【JVM技术专题】深入分析CG管理和原理查缺补漏「番外篇」
    前提概要本文主要针对HotspotVM中“CMSParNew”组合的一些使用场景进行总结。自Sun发布Java语言以来,开始使用GC技术来进行内存自动管理࿰ ... [详细]
  • php视频点播系统的简单介绍
    本文目录一览:1、phpvod管理员是什么 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • java内存模型浅析_浅析Java内存模型
    在并发编程中,需要处理两个关键问题:线程之间如何通信以及线程之间如何同步。通信是指线程之间以何种机制来交换信息。同步是指程序中用于控制不同线程间操作发生 ... [详细]
  • 什么是“传递优化缓存”“传递优化”是微软为了加快Windows更新和MicrosoftStore应用更新的下载速度,而在Windows10中引入的一种“自组织分布式本地化缓存”设计,可以在用户 ... [详细]
  • 文章目录前言必知必会的软件服务器分类机架式服务器塔式服务器刀片式服务器三者的区别虚拟服务器(云服务器)服务器的硬件组成服务器常见的品牌前言本文是循序渐进学linux的第一课,为 ... [详细]
  • 互联网世界 9 种基本的商业模式
    互联网世界9种基本的商业模式一个商业模式是运行一个公司的方法;通过该模式的运作,一个公司能维持自己的生存,就是说,能有收益。商业模式意味着一个公司是如何通过在价值链中定位自己,从而获 ... [详细]
  • 步骤一:明确主打的核心目标用户群(对应产品侧的定位)这个核心目标用户群体是该产品成功挤进市场的切入点,甚至是撬动市场的支点和撬杠。市面上几乎很少有产品是专门给一个群体用而对其他群体 ... [详细]
  • 不常见的RAID,RAID2,RAID4,RAID7
    RAID2的技术RAID2是RAID0的改良版,以汉明码(HammingCode)的方式将数据进行编码后分割为独立的位元,并 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
author-avatar
mobiledu2502912677
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有